* Графический редактор с командами на русском языке. * Программа КОНЦЕПТ, 27.02.2011-11.10.2011, www.gendoc.ru * Используется усеченный словарь словоформ. присвоить ДАННЫЕ_ИЗ_ИНТЕРНЕТ 1 функция Применить_правило символ начало конец номер_правила голова_правила хвост_правила память локальный новый_символ новый_хвост_правила позиция_сцепки новый_конец данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] если [хвост_правила] == {} Добавить_гипотезу [голова_правила] [начало] [конец] [номер_правила] иначе список голова новый_символ [хвост_правила] список хвост новый_хвост_правила [хвост_правила] вычислить + позиция_сцепки [конец] 1 факт сопоставить факты_кандидаты "r;<гипотеза>;[новый_символ];[позиция_сцепки];[?];[?]" для [факты_кандидаты] список взять новый_конец (факт взять $результат [$ОбъектЦикла] ) 5 Применить_правило [новый_символ] [начало] [новый_конец] [номер_правила] [голова_правила] [новый_хвост_правила] следующий конец возврат * добавление новой гипотезы, если такой еще нет * устанавливает переменную: ПРАВИЛО_ПРИМЕНЕНО функция Добавить_гипотезу символ начало конец номер_правила память локальный гипотеза данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] присвоить гипотеза "r;<гипотеза>;[символ];[начало];[конец];[номер_правила]" если (факт сопоставить $результат [гипотеза] ) иначе факт добавить [гипотеза] присвоить ПРАВИЛО_ПРИМЕНЕНО да когда [ОТЛАДКА] печать "ДОБАВЛЕНО: [гипотеза]" конец возврат функция Грамматический_разбор память локальный номер_факта успех \ текущее_слово текущее_слово_позиция1 текущее_слово_позиция2 э3 э5 номер_итерации * цикл, пока было примененно правило присвоить ПРАВИЛО_ПРИМЕНЕНО да номер_итерации 0 пока [ПРАВИЛО_ПРИМЕНЕНО] присвоить ПРАВИЛО_ПРИМЕНЕНО '' увеличить номер_итерации когда [ОТЛАДКА] печать '' "Итерация N:[номер_итерации]" * цикл по всем терминальным и нетерминальным символам гипотез данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] присвоить номер_факта 1 количество_фактов [$КоличествоФактов] пока [номер_факта] <= [количество_фактов] список сопоставить успех (факт взять $результат [номер_факта] ) "r;<гипотеза>;[?текущее_слово];[?текущее_слово_позиция1];[?текущее_слово_позиция2];[?]" если [успех] * попытка применения всех правил к текущему символу данные использовать [ОБЛАСТЬ_ПРАВИЛА] для (факт сопоставить $результат "r;<правило>;[?];[текущее_слово];[?]" ) список сопоставить успех (факт взять $результат [$ОбъектЦикла] ) "r;<правило>;[?э3];[текущее_слово];[?э5]" если [успех] Применить_правило [текущее_слово] [текущее_слово_позиция1] [текущее_слово_позиция2] [$ОбъектЦикла] [э3] [э5] конец данные использовать [ОБЛАСТЬ_ПРАВИЛА] следующий конец увеличить номер_факта данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] цикл цикл возврат функция Обработка_слова слово_исходное номер_слова память локальный слово морфология память локальный слово_свойства слово_категории слово_база слово_часть_речи присвоить слово_свойства {} слово_категории {} строка строчные слово [слово_исходное] присвоить "ПРЕДЛ;[номер_слова];слово" [слово_исходное] \ "ПРЕДЛ;[номер_слова];слово_нр" [слово] \ "ПРЕДЛ;[номер_слова];слово_вр" (строка прописные $результат [слово_исходное]) \ "ПРЕДЛ;[номер_слова];регистр" '' \ "ПРЕДЛ;[номер_слова];класс" '' \ "ПРЕДЛ;[номер_слова];свойства" {} \ "ПРЕДЛ;[номер_слова];базы" {} \ "ПРЕДЛ;[номер_слова];категории" {} *** 0) Определение регистра слова если [ПРЕДЛ;[номер_слова];слово] == [ПРЕДЛ;[номер_слова];слово_нр] присвоить "ПРЕДЛ;[номер_слова];регистр" нижний иначе если [ПРЕДЛ;[номер_слова];слово] == [ПРЕДЛ;[номер_слова];слово_вр] присвоить "ПРЕДЛ;[номер_слова];регистр" верхний иначе если (строка размер $результат [слово] ) > 1 если (строка взять $результат [ПРЕДЛ;[номер_слова];слово] 1 ) == (строка взять $результат [ПРЕДЛ;[номер_слова];слово_вр] 1 ) если (строка удалить $результат [ПРЕДЛ;[номер_слова];слово] 1 1 ) == (строка удалить $результат [ПРЕДЛ;[номер_слова];слово_нр] 1 1 ) присвоить "ПРЕДЛ;[номер_слова];регистр" имя_собственное конец конец конец конец конец *** 1) Слова из 1 буквы если (строка размер $результат [слово] ) = 1 выбрать [слово_исходное] вариант А;Б;В;Г;Д;Е;Ж;З;И;Й;К;Л;М;Н;О;П;Р;С;Т;У;Ф;Х;Ц;Ч;Ш;Щ;Э;Ю;Я * !!! Здесь используется $СписокЦикла из вызывающей функции !!! если (список голова $результат [$СписокЦикла] ) == . присвоить слово_свойства "{[слово_исходное];ИНИЦИАЛ}" "ПРЕДЛ;[номер_слова];класс" ИНИЦИАЛ конец вариант '.;,;?;!;+;-;*;/;\;=;>;<;(;);:;";%;$;@' присвоить слово_свойства "{[слово_исходное];ЗНАК_ПРЕПИНАНИЯ}" "ПРЕДЛ;[номер_слова];класс" ЗНАК_ПРЕПИНАНИЯ вариант "'" присвоить слово_свойства "{[слово_исходное];ЗНАК_ПРЕПИНАНИЯ}" "ПРЕДЛ;[номер_слова];класс" ЗНАК_ПРЕПИНАНИЯ конецВыбора конец если [ПРЕДЛ;[номер_слова];класс] == '' *** 2) Проверка на число если (вычислить являетсяЧислом $результат [слово] ) присвоить слово_свойства "{[слово];ЧИСЛО}" "ПРЕДЛ;[номер_слова];класс" ЧИСЛО иначе *** 3) Проверка по морфологическому словарю данные использовать [ОБЛАСТЬ_СЛОВА] понятие над морфология [слово] если [морфология] присвоить слово_свойства [морфология] "ПРЕДЛ;[номер_слова];класс" СЛОВО иначе присвоить слово_свойства [слово] "ПРЕДЛ;[номер_слова];класс" СЛОВО конец конец конец *** 6) Определение категорий слова если [ПРЕДЛ;[номер_слова];класс] == СЛОВО данные использовать [ОБЛАСТЬ_КАТЕГОРИИ] для [слово_свойства] присвоить слово_база [$ОбъектЦикла] понятие над слово_категории [слово_база] список сцепить "ПРЕДЛ;[номер_слова];свойства" $ "{[$ОбъектЦикла];[слово_категории]}" множество или "ПРЕДЛ;[номер_слова];базы" $ [слово_база] множество или "ПРЕДЛ;[номер_слова];категории" $ [слово_категории] следующий конец возврат функция Обработка_предложения предложение память очистить ПРЕДЛ присвоить ПРЕДЛ;исходное [предложение] ПРЕДЛ;базы {} ПРЕДЛ;категории {} данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] данные новый строка кСпискуСлов ПРЕДЛ;список [ПРЕДЛ;исходное] список размер ПРЕДЛ;количество_слов [ПРЕДЛ;список] для [ПРЕДЛ;список] Обработка_слова [$ОбъектЦикла] [$НомерИтерации] следующий Формирование_начальных_гипотез Грамматический_разбор данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] когда [ОТЛАДКА] показать данные возврат функция Формирование_начальных_гипотез память локальный номер_слова данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] для номер_слова (список сгенерить $результат 1 [ПРЕДЛ;количество_слов] ) если [ПРЕДЛ;[номер_слова];базы] == {} если [ПРЕДЛ;[номер_слова];класс] == ЧИСЛО факт добавить "r;<гипотеза>;ЧИСЛО;[номер_слова];[номер_слова];0" иначе факт добавить "r;<гипотеза>;[ПРЕДЛ;[номер_слова];слово_нр];[номер_слова];[номер_слова];0" конец иначе для [ПРЕДЛ;[номер_слова];базы] факт добавить "r;<гипотеза>;[$ОбъектЦикла];[номер_слова];[номер_слова];0" следующий для [ПРЕДЛ;[номер_слова];категории] факт добавить "r;<гипотеза>;[$ОбъектЦикла];[номер_слова];[номер_слова];0" следующий конец следующий возврат ********************************************* ****** Начало основного кода ****** ********************************************* присвоить ОТЛАДКА 0 ОБУЧЕНИЕ 0 присвоить ОБЛАСТЬ_КАТЕГОРИИ 2 ОБЛАСТЬ_ПРАВИЛА 3 ОБЛАСТЬ_ГИПОТЕЗЫ 4 ОБЛАСТЬ_СЛОВА 5 присвоить ФАЙЛ_КАТЕГОРИИ "cat.txt" присвоить ФАЙЛ_ПРАВИЛА "rule.txt" присвоить ФАЙЛ_СЛОВА "word.txt" присвоить ФАЙЛ_ВРЕМЕННЫЙ "tmp.tmp" Загрузить_данные [ОБЛАСТЬ_КАТЕГОРИИ] [ФАЙЛ_КАТЕГОРИИ] Загрузить_данные [ОБЛАСТЬ_ПРАВИЛА] [ФАЙЛ_ПРАВИЛА] Загрузить_данные [ОБЛАСТЬ_СЛОВА] [ФАЙЛ_СЛОВА] *** Графика присвоить _ПИ_ 3,141592653589 присвоить ОБЛАСТЬ_РИСУНОК 5 присвоить ЦЕНТР_Х 300 ЦЕНТР_У 300 присвоить ПОЛОЖЕНИЕ_Х [ЦЕНТР_Х] ПОЛОЖЕНИЕ_У [ЦЕНТР_У] присвоить РАЗМЕР_Х 200 РАЗМЕР_У [РАЗМЕР_Х] присвоить КУРСОР_ШАГ_Х [РАЗМЕР_Х] КУРСОР_ШАГ_У [РАЗМЕР_У] вычислить / СДВИГ [РАЗМЕР_Х] 4 присвоить МАСШТАБ_ДЛЯ_БОЛЬШОЙ 2 вычислить / МАСШТАБ_ДЛЯ_МАЛЫЙ 1 [МАСШТАБ_ДЛЯ_БОЛЬШОЙ] присвоить РАЗМЕР_КУРСОРА 30 присвоить КОМАНДА_КОНТЕКСТ '' ФИГУРЫ_КОНТЕКСТ {} присвоить ФАЙЛ_С_РИСУНКОМ "[$ТекущийКаталог]Рисунок1.txt" присвоить предложение 'нарисуй большой синий круг' предложения [предложение] Рисовать_курсор пока [предложение] ввести переменная предложение 'Введите предложение:' (список сцепить $результат '' [предложения] ) строка отсечьПробелы предложение $ если [предложение] строка коды предложение $ "#;{}_'" список сцепить предложения [предложение] [предложения] Обработка_предложения [предложение] Интерпретация_предложения Перерисовать_рисунок конец цикл *** Сохранение данных если [ОБУЧЕНИЕ] если [ДАННЫЕ_ИЗ_ИНТЕРНЕТ] * Если загрузка из Интернет, то данные не сохраняем иначе данные использовать [ОБЛАСТЬ_КАТЕГОРИИ] если [$данныеИзменены] данные сохранить "[$ТекущийКаталог][ФАЙЛ_КАТЕГОРИИ]" конец конец конец ****** Интерпретация предложения и рисование ***** функция Интерпретация_предложения память локальный команда память очистить ФРЕЙМ данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] факт сопоставитьМножество команда "r;<гипотеза>;[?рез];[?];[?];[?]" множество и команда $ РИСОВАТЬ_ФИГУРУ;ПЕРЕМЕСТИТЬ_КУРСОР;ПОВТОРИТЬ;ИЗМЕНИТЬ_ЦВЕТ;ИЗМЕНИТЬ_РАЗМЕР;ИЗМЕНИТЬ_ПОЛОЖЕНИЕ;ПОВЕРНУТЬ_ФИГУРУ;ПОВЕРНУТЬ_ФИГУРУ_ПО_ЧАСОВОЙ;ПОВЕРНУТЬ_ФИГУРУ_ПРОТИВ_ЧАСОВОЙ;ИЗМЕНИТЬ_ТОЧНОСТЬ;НОВЫЙ_РИСУНОК;ЗАПОМНИТЬ_РИСУНОК;ВСПОМНИТЬ_РИСУНОК;УДАЛИТЬ_ФИГУРУ если (список размер $результат [команда] ) = 1 если [команда] == ПОВТОРИТЬ присвоить команда [КОМАНДА_КОНТЕКСТ] иначе присвоить КОМАНДА_КОНТЕКСТ [команда] конец присвоить ФРЕЙМ;команда [команда] Выполнить_команду иначе показать сообщение "Простите, не могу :(" данные показать конец возврат функция Выполнить_команду память локальный новый_х новый_у выбрать [ФРЕЙМ;команда] вариант РИСОВАТЬ_ФИГУРУ Определить_свойство фигура _фигура '' Определить_свойство цвет _цвет черный Определить_свойство размер _размер обычный Определить_свойство количество _количество один Рассчитать_фигуру Рисовать_фигуру вариант ПЕРЕМЕСТИТЬ_КУРСОР Определить_свойство направление _направление '' Переместить_курсор вариант ИЗМЕНИТЬ_ЦВЕТ для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] Определить_свойство цвет _цвет черный Цвет_в_число Изменить_фигуру [$ОбъектЦикла] следующий вариант ИЗМЕНИТЬ_РАЗМЕР для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] Определить_свойство размер _размер обычный если [ФРЕЙМ;размер] == обычный Определить_свойство размер _изменять_размер обычный конец Масштаб_в_число Изменить_масштаб [ФРЕЙМ;масштаб_число] Изменить_фигуру [$ОбъектЦикла] следующий вариант ИЗМЕНИТЬ_ПОЛОЖЕНИЕ для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] Определить_свойство направление _направление '' выбрать [ФРЕЙМ;направление] вариант вправо Сдвиг_координат [КУРСОР_ШАГ_Х] 0 вариант влево Сдвиг_координат "-[КУРСОР_ШАГ_Х]" 0 вариант вверх Сдвиг_координат 0 "-[КУРСОР_ШАГ_У]" вариант вниз Сдвиг_координат 0 [КУРСОР_ШАГ_У] вариант центр * Не ясно, как делать??? конецВыбора Изменить_фигуру [$ОбъектЦикла] следующий вариант ПОВЕРНУТЬ_ФИГУРУ;ПОВЕРНУТЬ_ФИГУРУ_ПО_ЧАСОВОЙ для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] если [ФРЕЙМ;фигура] != круг Повернуть_фигуру 45 конец Изменить_фигуру [$ОбъектЦикла] следующий вариант ПОВЕРНУТЬ_ФИГУРУ_ПРОТИВ_ЧАСОВОЙ для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] если [ФРЕЙМ;фигура] != круг Повернуть_фигуру -45 конец Изменить_фигуру [$ОбъектЦикла] следующий вариант ИЗМЕНИТЬ_ТОЧНОСТЬ Определить_свойство точность _точность обычный Точность_в_число вычислить * КУРСОР_ШАГ_Х $ [ФРЕЙМ;точность_число] вычислить * КУРСОР_ШАГ_У $ [ФРЕЙМ;точность_число] вариант НОВЫЙ_РИСУНОК данные использовать [ОБЛАСТЬ_РИСУНОК] данные новый вариант ЗАПОМНИТЬ_РИСУНОК данные использовать [ОБЛАСТЬ_РИСУНОК] данные сохранить [ФАЙЛ_С_РИСУНКОМ] вариант ВСПОМНИТЬ_РИСУНОК если (файл существует $результат [ФАЙЛ_С_РИСУНКОМ] ) данные использовать [ОБЛАСТЬ_РИСУНОК] данные загрузить [ФАЙЛ_С_РИСУНКОМ] иначе показать сообщение "Файл с рисунком '[ФАЙЛ_С_РИСУНКОМ]' не найден." конец вариант УДАЛИТЬ_ФИГУРУ для [ФИГУРЫ_КОНТЕКСТ] Взять_фигуру [$ОбъектЦикла] Удалить_фигуру [$ОбъектЦикла] следующий конецВыбора возврат функция Определить_свойство имя_свойства имя_категории значение_свойства_по_умолчанию память локальный поз1 поз2 данные использовать [ОБЛАСТЬ_ГИПОТЕЗЫ] если (факт сопоставитьСПервым $результат "r;<гипотеза>;[имя_категории];[?поз1];[?поз2];[?]" ) присвоить "ФРЕЙМ;[имя_свойства]" (список голова $результат [ПРЕДЛ;[поз1];базы] ) иначе присвоить "ФРЕЙМ;[имя_свойства]" [значение_свойства_по_умолчанию] конец возврат функция Масштаб_в_число присвоить ФРЕЙМ;масштаб_число (список отобразить $результат [ФРЕЙМ;размер] обычный;большой;больше;больший;малый;маленький;маленькая;уменьшить;увеличить "1;[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_МАЛЫЙ];[МАСШТАБ_ДЛЯ_БОЛЬШОЙ]" 1 ) возврат функция Цвет_в_число присвоить ФРЕЙМ;цвет_число (список отобразить $результат [ФРЕЙМ;цвет] белый;черный;красный;красное;желтый;зеленый;синий 16;1;10;10;12;11;13 1 ) возврат функция Количество_в_число присвоить ФРЕЙМ;количество_число (список отобразить $результат [ФРЕЙМ;количество] один;два;три;тереть;четыре;пять 1;2;3;3;4;5 1 ) возврат функция Точность_в_число присвоить ФРЕЙМ;точность_число (список отобразить $результат [ФРЕЙМ;точность] обычный;точный;грубый "1;0,5;2" 1 ) возврат функция Рассчитать_фигуру память локальный номер_фигуры х1 у1 х2 у2 х3 у3 х4 у4 х5 у5 * Масштаб фигуры присвоить ФРЕЙМ;размер_х [РАЗМЕР_Х] ФРЕЙМ;размер_у [РАЗМЕР_У] ФРЕЙМ;сдвиг [СДВИГ] присвоить ФРЕЙМ;еще_точки {} Масштаб_в_число если [ФРЕЙМ;масштаб_число] <> 1 вычислить * ФРЕЙМ;размер_х $ [ФРЕЙМ;масштаб_число] вычислить * ФРЕЙМ;размер_у $ [ФРЕЙМ;масштаб_число] вычислить * ФРЕЙМ;сдвиг $ [ФРЕЙМ;масштаб_число] конец * Координаты фигуры вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 ) вычислить + х2 [х1] [ФРЕЙМ;размер_х] -1 вычислить + у2 [у1] [ФРЕЙМ;размер_у] -1 выбрать [ФРЕЙМ;фигура] вариант линия;круг присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2]" вариант квадрат присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у1];[х2]:[у2];[х1]:[у2]" вариант прямоугольник увеличить х2 [ФРЕЙМ;размер_х] присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у1];[х2]:[у2];[х1]:[у2]" вариант треугольник присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х2]:[у1]" вариант трапеция вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 ) вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 ) вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 ) присвоить у2 [у1] вычислить + х3 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) вычислить + у3 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 ) вычислить - х4 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) присвоить у4 [у3] присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х3]:[у3];[х4]:[у4]" вариант многоугольник вычислить - х1 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 ) вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 ) вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 4 ) присвоить у2 [у1] вычислить + х3 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) присвоить у3 [ПОЛОЖЕНИЕ_У] присвоить х4 [ПОЛОЖЕНИЕ_Х] вычислить + у4 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 2 ) вычислить - х5 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) присвоить у5 [у3] присвоить ФРЕЙМ;еще_точки "[х1]:[у1];[х2]:[у2];[х3]:[у3];[х4]:[у4];[х5]:[у5]" вариант ромб вычислить - у1 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 4 ) вычислить + х2 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) вычислить + у3 [ПОЛОЖЕНИЕ_У] (вычислить / $результат [ФРЕЙМ;размер_у] 4 ) вычислить - х4 [ПОЛОЖЕНИЕ_Х] (вычислить / $результат [ФРЕЙМ;размер_х] 2 ) присвоить ФРЕЙМ;еще_точки "[ПОЛОЖЕНИЕ_Х]:[у1];[х2]:[ПОЛОЖЕНИЕ_У];[ПОЛОЖЕНИЕ_Х]:[у3];[х4]:[ПОЛОЖЕНИЕ_У]" конецВыбора Цвет_в_число Количество_в_число возврат *** Преобразование координат фигуры функция Центр_фигуры память локальный успешно х у х_мин у_мин х_макс у_макс для [ФРЕЙМ;еще_точки] строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]" если [$НомерИтерации] = 1 присвоить х_мин [х] у_мин [у] х_макс [х] у_макс [у] иначе если [х_мин] > [х] присвоить х_мин [х] конец если [х_макс] < [х] присвоить х_макс [х] конец если [у_мин] > [у] присвоить у_мин [у] конец если [у_макс] < [у] присвоить у_макс [у] конец конец следующий вычислить / ФРЕЙМ;центр_х (вычислить + $результат [х_макс] [х_мин] ) 2 вычислить / ФРЕЙМ;центр_у (вычислить + $результат [у_макс] [у_мин] ) 2 возврат функция Сдвиг_координат по_горизонтали по_вертикали память локальный успешно еще_точки х у присвоить еще_точки {} для [ФРЕЙМ;еще_точки] строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]" вычислить + х $ [по_горизонтали] вычислить + у $ [по_вертикали] список сцепить еще_точки $ "[х]:[у]" следующий присвоить ФРЕЙМ;еще_точки [еще_точки] возврат функция Изменить_масштаб масштаб память локальный успешно еще_точки х у Центр_фигуры присвоить еще_точки {} для [ФРЕЙМ;еще_точки] строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]" вычислить + х [ФРЕЙМ;центр_х] (вычислить * $результат (вычислить - $результат [х] [ФРЕЙМ;центр_х] ) [масштаб] ) вычислить + у [ФРЕЙМ;центр_у] (вычислить * $результат (вычислить - $результат [у] [ФРЕЙМ;центр_у] ) [масштаб] ) список сцепить еще_точки $ "[х]:[у]" следующий присвоить ФРЕЙМ;еще_точки [еще_точки] возврат функция Повернуть_фигуру градусы память локальный успешно еще_точки х у х1 у1 кос син _УГОЛ_РАДИАНЫ_ вычислить * _УГОЛ_РАДИАНЫ_ (вычислить / $результат [градусы] 180 ) [_ПИ_] вычислить косинус кос [_УГОЛ_РАДИАНЫ_] вычислить синус син [_УГОЛ_РАДИАНЫ_] Центр_фигуры присвоить еще_точки {} для [ФРЕЙМ;еще_точки] строка сопоставить успешно [$ОбъектЦикла] "[?х];:;[?у]" вычислить - х $ [ФРЕЙМ;центр_х] вычислить - у $ [ФРЕЙМ;центр_у] вычислить - х1 (вычислить * $результат [х] [кос] ) (вычислить * $результат [у] [син] ) вычислить + у1 (вычислить * $результат [х] [син] ) (вычислить * $результат [у] [кос] ) вычислить + х [ФРЕЙМ;центр_х] [х1] вычислить + у [ФРЕЙМ;центр_у] [у1] список сцепить еще_точки $ "[х]:[у]" следующий присвоить ФРЕЙМ;еще_точки [еще_точки] возврат функция Рисовать_фигуру присвоить ФИГУРЫ_КОНТЕКСТ {} данные использовать [ОБЛАСТЬ_РИСУНОК] для (список сгенерить $результат 1 [ФРЕЙМ;количество_число] ) понятие автономер номер_фигуры <автономер> <номер_фигуры> факт добавить "r;<фигура>;[номер_фигуры];[ФРЕЙМ;фигура];[ФРЕЙМ;цвет_число];{[ФРЕЙМ;еще_точки]}" список сцепить ФИГУРЫ_КОНТЕКСТ $ [номер_фигуры] Сдвиг_координат (вычислить + $результат [ФРЕЙМ;размер_х] [ФРЕЙМ;сдвиг] ) 0 следующий возврат функция Взять_фигуру номер_фигуры память локальный номер_факта данные использовать [ОБЛАСТЬ_РИСУНОК] факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?ФРЕЙМ;фигура];[?ФРЕЙМ;цвет_число];[?ФРЕЙМ;еще_точки]" возврат функция Изменить_фигуру номер_фигуры память локальный номер_факта данные использовать [ОБЛАСТЬ_РИСУНОК] факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?];[?];[?]" факт присвоить [номер_факта] "r;<фигура>;[номер_фигуры];[ФРЕЙМ;фигура];[ФРЕЙМ;цвет_число];{[ФРЕЙМ;еще_точки]}" возврат функция Удалить_фигуру номер_фигуры память локальный номер_факта данные использовать [ОБЛАСТЬ_РИСУНОК] факт сопоставитьСПервым номер_факта "r;<фигура>;[номер_фигуры];[?];[?];[?]" факт удалитьПоНомеру [номер_факта] возврат *** Курсор функция Переместить_курсор выбрать [ФРЕЙМ;направление] вариант вправо увеличить ПОЛОЖЕНИЕ_Х [КУРСОР_ШАГ_Х] вариант влево увеличить ПОЛОЖЕНИЕ_Х "-[КУРСОР_ШАГ_Х]" вариант вверх увеличить ПОЛОЖЕНИЕ_У "-[КУРСОР_ШАГ_У]" вариант вниз увеличить ПОЛОЖЕНИЕ_У [КУРСОР_ШАГ_У] вариант центр присвоить ПОЛОЖЕНИЕ_Х [ЦЕНТР_Х] ПОЛОЖЕНИЕ_У [ЦЕНТР_У] конецВыбора возврат функция Рисовать_курсор присвоить $ТолщинаЛинии 3 $ЦветЛинии 1 рисовать линия (вычислить - $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \ [ПОЛОЖЕНИЕ_У] \ (вычислить + $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \ [ПОЛОЖЕНИЕ_У] рисовать линия [ПОЛОЖЕНИЕ_Х] \ (вычислить - $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) \ [ПОЛОЖЕНИЕ_Х] \ (вычислить + $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) присвоить $ЦветЛинии 16 рисовать линия (вычислить - $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \ (вычислить + $результат [ПОЛОЖЕНИЕ_У] 3 ) \ (вычислить + $результат [ПОЛОЖЕНИЕ_Х] [РАЗМЕР_КУРСОРА] ) \ (вычислить + $результат [ПОЛОЖЕНИЕ_У] 3 ) рисовать линия (вычислить + $результат [ПОЛОЖЕНИЕ_Х] 3 ) \ (вычислить - $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) \ (вычислить + $результат [ПОЛОЖЕНИЕ_Х] 3 ) \ (вычислить + $результат [ПОЛОЖЕНИЕ_У] [РАЗМЕР_КУРСОРА] ) возврат *** Перерисовка всего рисунка функция Перерисовать_рисунок память локальный номер_факта фигура цвет_число х1 у1 х2 у2 х3 у3 х4 у4 х5 у5 \ успешно еще_точки присвоить $ЦветКисти 16 рисовать очистить данные использовать [ОБЛАСТЬ_РИСУНОК] когда [ОТЛАДКА] данные показать присвоить номер_факта 1 пока [номер_факта] <= [$КоличествоФактов] если (список сопоставить $результат (факт взять $результат [номер_факта] ) "r;<фигура>;[?];[?фигура];[?цвет_число];[?еще_точки]" ) присвоить $ЦветКисти [цвет_число] $ЦветЛинии [цвет_число] присвоить $ТолщинаЛинии 1 строка сопоставить успешно (список взять $результат [еще_точки] 1 ) "[?х1];:;[?у1]" строка сопоставить успешно (список взять $результат [еще_точки] 2 ) "[?х2];:;[?у2]" выбрать [фигура] вариант линия рисовать линия [х1] [у1] [х2] [у2] вариант круг рисовать круг [х1] [у1] [х2] [у2] вариант треугольник строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]" рисовать треугольник [х1] [у1] [х2] [у2] [х3] [у3] вариант квадрат;прямоугольник;трапеция;ромб строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]" строка сопоставить успешно (список взять $результат [еще_точки] 4 ) "[?х4];:;[?у4]" рисовать многоугольник [х1] [у1] [х2] [у2] [х3] [у3] [х4] [у4] вариант многоугольник строка сопоставить успешно (список взять $результат [еще_точки] 3 ) "[?х3];:;[?у3]" строка сопоставить успешно (список взять $результат [еще_точки] 4 ) "[?х4];:;[?у4]" строка сопоставить успешно (список взять $результат [еще_точки] 5 ) "[?х5];:;[?у5]" рисовать многоугольник [х1] [у1] [х2] [у2] [х3] [у3] [х4] [у4] [х5] [у5] конецВыбора конец увеличить номер_факта цикл Рисовать_курсор возврат функция Загрузить_данные область_данных имя_файла данные использовать [область_данных] если [ДАННЫЕ_ИЗ_ИНТЕРНЕТ] импорт webText "http://www.gendoc.ru/Examples/[имя_файла]" "[$ТекущийКаталог][ФАЙЛ_ВРЕМЕННЫЙ]" данные загрузить "[$ТекущийКаталог][ФАЙЛ_ВРЕМЕННЫЙ]" >База фактов '[имя_файла]' загружена с www.gendoc.ru. иначе данные загрузить "[$ТекущийКаталог][имя_файла]" конец возврат